#include "jsonconfigwriter.h"
#include <QFile>
#include <QDir>
#include <QFileInfo>
#include <QDebug>
#include <qjson/parser.h>
#include <qjson/serializer.h>

JsonConfigWriter::JsonConfigWriter(QObject *parent,const QString &uiFilePath)
    : QObject(parent),m_uiFilePath(uiFilePath)
{}
// =================设置JSON保存地址 =================
QString JsonConfigWriter::makeJsonPath() const
{
    QFileInfo fi(m_uiFilePath);

    // 如果 outputDir 没给，就放在 UI 文件所在目录
    QString baseDir =  fi.absolutePath();

    // 文件名 = UI 文件的 baseName + ".json"
    QString fileName = fi.baseName() + ".json";

    QString JsonPath = baseDir + "/" + fileName;

    return JsonPath;
}

QString JsonConfigWriter::makeUsersPath() const
{
    return QDir::currentPath() + "/users.json";
}

// ================= 控件配置 =================
//读取JSON文件获取控件名称
bool JsonConfigWriter::Read_Json_To_Ui(const QString &userRole,QStringList &hiddenCtrls) const
{
    //清理被隐藏空间列表
    hiddenCtrls.clear();
    //读取Json文件中的User
    QVariantMap Ui_JsonRoot;
    QVariantMap UserMap = Read_Ui_UserMap(Ui_JsonRoot);
    if (UserMap.contains(userRole)) {
        //toMap()解包QVariant obj(传入Ui_JsonRoot时被重新封装了)
        QVariantMap obj =UserMap[userRole].toMap();
        //toStringList() 获取 QVariantMap obj中的hidden_controls健的文本值
        hiddenCtrls = obj.value("hidden_controls").toStringList();
    }
    return true;
}

//将控件名称写入JSON文件
bool JsonConfigWriter::Write_To_Ui_Json(const QString &userRole,const QStringList &hiddenCtrls)
{

     QVariantMap Ui_JsonRoot;
     QVariantMap UsersMap = Read_Ui_UserMap(Ui_JsonRoot);

    //向JSON文件插入新内容

    //1.创建QVariantMap对象obj，存储要插入到JSON文件的内容（要隐藏的控件）
     QVariantMap userobj;
    //2.向QVariantMap obj插入hiddenCtrls(被隐藏控件->控件名字)
    userobj["hidden_controls"] = hiddenCtrls;


    //再将QVariantMap(用户->内容）插入到JSON文件中
    //注意：此时的obj会被自动封装进QVariant当中

    UsersMap.insert(userRole, userobj);

    Ui_JsonRoot["users"] = UsersMap;
    Ui_JsonRoot["last_user"] = userRole;

    return saveMapToJson(makeJsonPath(), Ui_JsonRoot);
}


// ================= 用户信息 =================

QVariantMap JsonConfigWriter::Read_Ui_UserMap(QVariantMap& Ui_JsonRoot)const
{
     //获取Ui文件地址
    QString Ui_JsonPath = makeJsonPath();
    //获取Json解析文件
    if (!load_Ui_JsonRootToMap(Ui_JsonPath, Ui_JsonRoot)) {
            return QVariantMap();  // 出错时返回空
        }
    //解析出UserMap
   QVariantMap UserMap =  Ui_JsonRoot.value("users").toMap();
    return UserMap;
}
QStringList JsonConfigWriter::Match_Users_list() const
{
    // 1. 读取全局 users.json
    QVariantMap User_Ui_JsonRoot;
    if (!load_Ui_JsonRootToMap(makeUsersPath(), User_Ui_JsonRoot))
        return QStringList();
    QStringList globalUsers = User_Ui_JsonRoot.value("users").toStringList();

    // 2. 读取当前 UI 的配置文件
    QStringList uiUsers;
    if (!m_uiFilePath.isEmpty())
    {
        QVariantMap Ui_JsonRoot;
        QVariantMap usersMap = Read_Ui_UserMap(Ui_JsonRoot);
        if (usersMap.isEmpty())  return QStringList(); // 没加载成功或没有用户节点 → 返回空
        uiUsers = usersMap.keys();  // 用户名都在 users 节点下

    }

    // 3. 如果 ui.json 没有任何用户 → 返回空
    if (uiUsers.isEmpty())
        return QStringList();

    // 4. 求交集
    QStringList result;
    for (const QString &Match_User : globalUsers) {
        if (uiUsers.contains(Match_User))
            result << Match_User;
    }
    return result;
}

bool JsonConfigWriter::readLastUser(QString &userRole) const
{

    QVariantMap Ui_JsonRoot;
    if (!load_Ui_JsonRootToMap(makeJsonPath(), Ui_JsonRoot))
        return false;

    // 如果没有 last_user 字段，返回 false
    if (!Ui_JsonRoot.contains("last_user"))
        return false;

    userRole = Ui_JsonRoot.value("last_user").toString();
    return !userRole.isEmpty();
}

bool JsonConfigWriter::Write_To_User_Json(const QString &newuser)
{

    QVariantMap User_JsonRoot;
    load_Ui_JsonRootToMap(makeUsersPath(), User_JsonRoot);

    QStringList userlist = User_JsonRoot.value("users").toStringList();
    if (!userlist.contains(newuser))
        userlist << newuser;

    User_JsonRoot["users"] = userlist;
    User_JsonRoot["last_user"] = newuser;

    return saveMapToJson(makeUsersPath(), User_JsonRoot);
}

// ================= 辅助方法 =================

bool JsonConfigWriter::load_Ui_JsonRootToMap(const QString &JsonPath, QVariantMap &Ui_JsonRoot) const
{
    Ui_JsonRoot.clear();
    QFile file(JsonPath);
    //判断JSON是否存在
    if (!file.exists())
        return true;

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return false;
    //parse自动遍历JSON树，转换为C++类型
    //因为无法确认类型，用QVariant存入
    QJson::Parser parser;
    bool ok = false;

     //判断解析出来的JSON根节点是否是对象类型QVariantMap
    QVariant data = parser.parse(&file, &ok);
    file.close();

    if (!ok || !data.canConvert<QVariantMap>())
        return false;
    //toMap()解开data中的QVariantMap(根节点)
    //不需要全部递归解包（如果内容非常大），获取根节点之后就可以to解指定包了
    Ui_JsonRoot = data.toMap();
    return true;
}

bool JsonConfigWriter::saveMapToJson(const QString &JsonPath, const QVariantMap &Ui_JsonRoot) const
{
    //传入JSON文件地址+以写入形式打开
    QFile file(JsonPath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return false;

    QJson::Serializer serializer;
    bool ok = false;

    //serialize()将QVariantMap转换为JSON字节流，用QByteArray接收
    QByteArray Json = serializer.serialize(Ui_JsonRoot, &ok);
    if (!ok) return false;

    //将接收到的JSON字节流写入JSON当中
    file.write(Json);
    file.close();
    return true;
}
//bool JsonConfigWriter::removeUserFromUsers(const QString &username)
//{
//    QString usersPath = makeUsersPath();
//    QVariantMap root;
//    if (!load_Ui_JsonRootToMap(usersPath, root))
//        return false;

//    QStringList users = root.value("users").toStringList();
//    users.removeAll(username);
//    root["users"] = users;

//    if (root.value("last_user").toString() == username) {
//        root.remove("last_user");
//    }

//    return saveMapToJson(usersPath, root);
//}

bool JsonConfigWriter::remove_User_From_Ui_Json(const QString &username)
{
    QVariantMap Ui_JsonRoot;
    QVariantMap UserMap = Read_Ui_UserMap(Ui_JsonRoot);
    if (UserMap.contains(username)) {
        UserMap.remove(username);
        //修改了 UserMap，一定要把它放回 Ui_JsonRoot！
        Ui_JsonRoot["users"] = UserMap;
    }

    return saveMapToJson(makeJsonPath(), Ui_JsonRoot);
}
